wayland: Get tiled state from gtk_shell instead of xdg_shell
authorJonas Ådahl <jadahl@gmail.com>
Tue, 28 Jun 2016 07:01:22 +0000 (15:01 +0800)
committerJonas Ådahl <jadahl@gmail.com>
Thu, 25 Aug 2016 04:31:40 +0000 (12:31 +0800)
Use our the 'tiled' entry from our new 'state' enum sent via
xdg_surface.configure.

https://bugzilla.gnome.org/show_bug.cgi?id=769937

gdk/wayland/gdkwindow-wayland.c
gdk/wayland/protocol/gtk-shell.xml

index dc8ab416953ef874590f67b638e1856b5a5c1231..df6fa6bf594e16470cddfe4fe1ca71399ca8cd9b 100644 (file)
@@ -45,13 +45,6 @@ enum {
 
 static guint signals[LAST_SIGNAL];
 
-/*
- * Define GNOME additional states to xdg-shell
- * The current reserved range for GNOME is 0x1000 - 0x1FFF
- */
-
-#define XDG_SURFACE_STATE_GNOME_TILED 0x1000
-
 #define WINDOW_IS_TOPLEVEL_OR_FOREIGN(window) \
   (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD &&   \
    GDK_WINDOW_TYPE (window) != GDK_WINDOW_OFFSCREEN)
@@ -182,6 +175,10 @@ struct _GdkWindowImplWayland
     gint rect_anchor_dx;
     gint rect_anchor_dy;
   } pending_move_to_rect;
+
+  struct {
+    GdkWindowState state;
+  } pending;
 };
 
 struct _GdkWindowImplWaylandClass
@@ -1252,16 +1249,15 @@ xdg_surface_configure (void               *data,
           break;
         case XDG_SURFACE_STATE_RESIZING:
           break;
-        /* GNOME additional states to xdg-shell */
-        case XDG_SURFACE_STATE_GNOME_TILED:
-          new_state |= GDK_WINDOW_STATE_TILED;
-          break;
         default:
           /* Unknown state */
           break;
         }
     }
 
+  new_state |= impl->pending.state;
+  impl->pending.state = 0;
+
   fixed_size =
     new_state & (GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_FULLSCREEN | GDK_WINDOW_STATE_TILED);
 
@@ -2203,6 +2199,38 @@ gdk_wayland_window_get_type_hint (GdkWindow *window)
   return impl->hint;
 }
 
+static void
+gtk_surface_configure (void                *data,
+                       struct gtk_surface1 *gtk_surface,
+                       struct wl_array     *states)
+{
+  GdkWindow *window = GDK_WINDOW (data);
+  GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
+  GdkWindowState new_state = 0;
+  uint32_t *p;
+
+  wl_array_for_each (p, states)
+    {
+      uint32_t state = *p;
+
+      switch (state)
+        {
+        case GTK_SURFACE1_STATE_TILED:
+          new_state |= GDK_WINDOW_STATE_TILED;
+          break;
+        default:
+          /* Unknown state */
+          break;
+        }
+    }
+
+  impl->pending.state |= new_state;
+}
+
+static const struct gtk_surface1_listener gtk_surface_listener = {
+  gtk_surface_configure
+};
+
 static void
 gdk_wayland_window_init_gtk_surface (GdkWindow *window)
 {
@@ -2220,6 +2248,9 @@ gdk_wayland_window_init_gtk_surface (GdkWindow *window)
   impl->display_server.gtk_surface =
     gtk_shell1_get_gtk_surface (display->gtk_shell,
                                 impl->display_server.wl_surface);
+  gtk_surface1_add_listener (impl->display_server.gtk_surface,
+                             &gtk_surface_listener,
+                             window);
 }
 
 static void
index 2e750ea0f1dc0a567edddf1a9885ad8ac357c4f5..5cfdd42c2341135065abfd5d553924ebf56ebce2 100644 (file)
     <request name="present">
       <arg name="time" type="uint"/>
     </request>
+
+    <!-- Version 2 additions -->
+
+    <enum name="state">
+      <entry name="tiled" value="1"/>
+    </enum>
+
+    <event name="configure">
+      <arg name="states" type="array"/>
+    </event>
   </interface>
 
 </protocol>